昨天已經認識分隔符號 DELIMITER和STORED PROCEDURE建立語法,
建立出BMI小程式的骨幹,接下來我們將SP名稱取做BMICompute
,會變成這樣。
DELIMITER $$
CREATE PROCEDURE BMICompute ([參數名稱1] [型別1],[參數名稱2] [型別2])
BEGIN
[程式邏輯放這裡]
END
$$
再來是參數的介紹。
參數的功用是把值帶進函式裡面,
因為我們可能每次要計算或是要找的值不一樣,
所以不能預先跟程式說我們要用什麼值,
那我們就先用參數來代替,
之後用函式的時候,再跟程式說某某參數等於多少,
程式就會套入使用。
就像數學常常用到的未知數X,Y,Z,
如果我們設計一個程式叫做「加法」,
程式內容是「返回X+Y」,
但是程式不知道X跟Y是什麼,要我們告訴他,
那我們就會這樣用:加法(2,3),
程式會把X當成2,Y當成3,最後我們會收到2+3,也就是5。
而在BMI計算中,我們需要用到身高、體重、計算公式、過重標準,
這幾樣中那些是參數呢?
是「身高」和「體重」,
因為每次算的人身高和體重不一定會一樣,而且程式也不會知道,
必須我們跟程式說,
因此我們會設定預存程序BMICompute的參數有兩個:
身高:height
體重:weight
同時我們把這兩個參數設定成整數,
就會變成這樣:
DELIMITER $$
CREATE PROCEDURE BMICompute (`height` int,`weight` int)
BEGIN
[程式邏輯放這裡]
END
$$
接下來我們要撰寫程式邏輯,
BMI的公式是體重/(身高*身高),
我們的程式邏輯是:
如果BMI>24,回傳:你的BMI是{(身高*身高)},BMI,過重了
如果24>BMI>18,回傳:你的BMI是{(身高*身高)},BMI,正常
如果BMI<18,回傳:你的BMI是{(身高*身高)},BMI,太輕了
這三行看起來,{體重/(身高*身高}是不是很繞口?
其實乾脆點,寫BMI就看得懂了,
但我們因為小時候學過,所以看得懂BMI是什麼,
程式卻沒有學過,這時候我們需要告訴它BMI=體重/(身高*身高)。
這時BMI就是變數。
變數可以讓程式碼易讀易維護,
不然通篇「體重/(身高*身高」看了頭都昏了,
再來,如果未來要改公式,我們就要改三次,
在其他專案中,甚至可能要改三百次,
但如果我們先宣告一個叫做BMI的變數,會等於體重/(身高*身高),
把程式寫成這樣:
{BMI}=體重/(身高*身高)
如果BMI>24,回傳:你的BMI是{BMI},BMI,過重了
如果24>BMI>18,回傳:你的BMI是{BMI},BMI,正常
如果BMI<18,回傳:你的BMI是{BMI},BMI,太輕了
之後如果要改公式,只要把{BMI}=體重/(身高*身高)這行改掉就好了!
在MYSQL的預存程序中,宣告變數的語法是:
1.DECLARE
2.變數名稱
3.型別;
接下來使用的時候直接寫變數名稱就可以了。
宣告變數後,我們要設定變數的值,設定的語法是
1.SET
2.變數名稱
3.=值
現在要設定BMI變數,值會是 體重參數/(身高參數/100*身高參數/100)
身高參數/100是因為預設台灣人身高會用公分計算,這裡要換算成公尺!
DELIMITER $$
CREATE PROCEDURE BMICompute (`height` int,`weight` int)
BEGIN
DECLARE BMI DECIMAL(5,2);
SET BMI=weight/((height/100)*height/100);
END
$$
目前我們該有的都有了,有身高體重,也換算成BMI,
接下來要輸出成果,
可以試著自己寫完囉!
程式邏輯:
{BMI}=體重/(身高*身高)
如果BMI>24,回傳:你的BMI是{BMI},BMI,過重了
如果24>BMI>18,回傳:你的BMI是{BMI},BMI,正常
如果BMI<18,回傳:你的BMI是{BMI},BMI,太輕了
實際使用:
身高:160
體重:50
回傳:你的BMI是19.53正常
提示:
「如果」我們可以用IF或CASE。
SELECT出來的值會被回傳。
回傳部分因為是文字,加上計算,我們可以用CONCAT()組合。